import { TreeKey, TreeNodeData } from "element-plus/es/components/tree/src/tree.type";
import { BaseComponent } from "../type";
import type Node from "element-plus/es/components/tree/src/model/node";

export interface TreeData {
	/** 标题 */
	label: string;
	/** 树形组件数据唯一值 */
	value: number | string | undefined;
	/** 禁用 */
	disabled?: boolean;
	/** 子数据 */
	children?: TreeData[];
}

type ChangeType = {
	/** 选中的key */
	checkedKeys: number[];
	/** 选中的Node */
	checkedNodes: TreeData[];
	/** 未完全选中的Key */
	halfCheckedKeys: number[];
	/** 未完全选中的Node */
	halfCheckedNodes: TreeData[];
};

export interface TreeOptions {
	source: TreeData[];
	/** 唯一值 */
	nodeKey: string;
	/** 默认展开节点 */
	expand: boolean;
	/** 懒加载配置 */
	lazy: LazyType | false;
	/** 是否允许禁用 默认允许 */
	allowDisabling?: boolean;
	/** 选择变化时回调 */
	change(node: TreeData, detail: ChangeType): void;
}

export interface Tree extends BaseComponent {
	/** 设置数据 */
	setTreeSource(data: TreeData[]): void;
	/** 获取数据 */
	getTreeSource(): TreeData[];
	/** 设置选中 */
	setTreeSelection(data: (number | string)[]): void;
	/** state == Node 返回选中的全数据  state == Keys 只返回 nodeKey 指定的值 默认 value */
	getTreeSelection(state: "Node" | "Keys"): (TreeNodeData | TreeKey)[] | [];
	/** 数据 */
	setDisabled(id: number | string, state: boolean): void;
}

interface LazyType {
	load(node: Node, resolve: (data: any[]) => void): any;
}
